package cc.wanforme.st.server.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;

/**Spring 安全配置
 * @author wanne
 * 2020年4月26日
 * 
 */
@Configuration
@EnableWebSecurity
@EnableMethodSecurity // SpringBoot-3
//@EnableGlobalMethodSecurity(prePostEnabled=true) //  before SpringBoot-3
public class SpringSecurityConfiguration {
//public class SpringSecurityConfiguration extends WebSecurityConfigurerAdapter{ // before SpringBoot-2.7
	/*
	 * @EnableGlobalMethodSecurity(prePostEnabled=true) 最后一个注解启用方法级的安全控制，
	 * 控制层方法前加上 @PreAuthorize("hasAuthority('permission')")要求具有permission权限、或@PreAuthorize("hasRole('USER')")要求为USER角色
	 * 
	 * 注： @PreAuthorize("hasRole('USER')") 判断角色, SimpleGrantedAuthority 的 role 有 'ROLE_' 前缀则表示角色，没有则表示权限。
	 * 例如:  new SimpleGrantedAuthority("ROLE_USER"); 表示 'USER' 角色 
	 */

	
	/* before SpringBoot 2.7
	 *  自定义路径的权限
	@Override
	public void configure(HttpSecurity http) throws Exception {
		//使用 @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled=true) 之后， 就只能使用注解 @PreAuthorize 来认证了。默认所有请求不需要认证。
		http
			.authorizeRequests()
			.antMatchers("/**").permitAll();
		
		//在验证前，将验证信息添加到 SecurityContext 中
		http.addFilterBefore(rememberMeFilter(mTokenService, authService, adminService, userService), 
				UsernamePasswordAuthenticationFilter.class);
		
		// TODO 待验证
		http.csrf().disable(); //允许跨域伪造请求
		//http.cors().disable(); 
	}
	*/

	/** 自定义路径的权限（过滤器） 
	 * // springboot 2.7 ~ SpringBoot-3
	@Bean
	public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
		//使用 @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled=true) 之后， 就只能使用注解 @PreAuthorize 来认证了。默认所有请求不需要认证。
		http
			.authorizeRequests()
			.antMatchers("/**").permitAll();
		//在验证前，将验证信息添加到 SecurityContext 中
		http.addFilterBefore(rememberMeFilter(mTokenService, authService, adminService, userService), 
				UsernamePasswordAuthenticationFilter.class);
		
		http.csrf().disable(); //允许跨域伪造请求
		http.cors().disable(); // 允许跨域资源共享
		return http.build();
	}
	*/
	
	// SpringBoot-3
	@Bean
	public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
		http.authorizeHttpRequests(registry -> {
			registry.requestMatchers("/**").permitAll();
		});
	
		http.csrf(e -> e.disable()); //允许跨域伪造请求
		http.cors(e -> e.disable()); // 允许跨域资源共享
		return http.build();
	}
	
//	@Bean
//	public WebSecurityCustomizer webSecurityCustomizer(){
//		return (web) -> {
//			web.ignoring().antMatchers("/**");
//		};
//	}
	
}
